package cn.neusoft.service.impl;

import cn.neusoft.po.Category;
import cn.neusoft.mapper.CategoryMapper;
import cn.neusoft.service.ICategoryService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * <p>
 * 商品三级分类 服务实现类
 * </p>
 *
 * @author hxj
 * @since 2023-12-21
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements ICategoryService {

    @Override
    public List<Category> tree() {
        //准备好最终要返回的一级分类集合
        List<Category> first = new ArrayList<>();

        Map<Long,Category> map = new HashMap<>();

        QueryWrapper queryWrapper = new QueryWrapper();
        //查询条件  通过level进行排序
        queryWrapper.orderByAsc("level","sort");

        //查询到所有的分类
        List<Category> all = baseMapper.selectList(queryWrapper);

        //遍历所有分类的集合
        for (Category category : all) {
            //如果是一级
            if (category.getLevel()==1){
                //加入一级分类的集合
                first.add(category);
                //添加到map中  方便查询   map：分类id  分类对象
                map.put(category.getId(),category);
            }else if (category.getLevel()==2){
                //添加map中  二级添加到map 原因是二级分类对象中还需要添加三级子节点
                map.put(category.getId(),category);
                //从map中查找自己的父分类对象
                Category parent = map.get(category.getParentId());
                //将自己加入到父分类节点的子节点集合中
                parent.getChildren().add(category);
            }else if (category.getLevel()==3){
                //查找父节点
                Category parent = map.get(category.getParentId());
                //将自己放入父节点分类的子节点集合中
                parent.getChildren().add(category);
            }
        }
        return first;
    }

    /**
     * 更新状态：
     *    如果是三级 只更新自己即可
     *    如果是二级  更新自己和自己包含的三级子节点
     *    如果是一级  更新自己和自己包含的二级子节点及二级子节点包含的三级子节点
     * @param category
     * @return
     */
    @Transactional
    @Override
    public boolean changeState(Category category) {

        //准备一个要修改状态的id值的集合
        List<Long> upIds = new ArrayList<>();
        //加入当前节点的id
        upIds.add(category.getId());

        //如果是一级
        if (category.getLevel()==1){
            //查找包含的二级节点的id集合
            List<Long> subIds2 = selectSubIds(upIds);
            //将查找到的所有二级节点的id加入到要更新状态的集合中
            upIds.addAll(subIds2);
            //根据二级节点的id值再查找包含的三级节点的id值集合
            List<Long> subIds3 = selectSubIds(subIds2);
            //将所有三级节点的id值加入要更新状态的id集合中
            upIds.addAll(subIds3);
        //如果是二级
        } else if(category.getLevel()==2){
            //查找包含的所有三级节点的id值
            List<Long> subIds3 = selectSubIds(upIds);
            //将所有三级节点的id值加入要更新状态的id集合中
            upIds.addAll(subIds3);
        }

        System.out.println("要更新状态的类别id有："+upIds);

        UpdateWrapper updateWrapper = new UpdateWrapper();
        updateWrapper.set("state",category.getState());
        updateWrapper.in("id",upIds);
        boolean update = update(updateWrapper);

        return update;
    }

    /**
     * 根据父id的集合查找分类id
     * select id from t_category where parent_id in (...)
     * @param ids
     * @return
     */
    public List<Long> selectSubIds(Collection<Long> ids){
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.select("id")
                .in("parent_id",ids);
        List<Long> levelSubIds = baseMapper.selectObjs(queryWrapper);
        return levelSubIds;
    }


}
